home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Disk / moni / FileX-src.lha / FileX-src / listreq.c < prev    next >
C/C++ Source or Header  |  2003-09-19  |  7KB  |  324 lines

  1. #include "FileXStructs.h"
  2. #include "FileXStrings.h"
  3. #include "allprotos.h"
  4. #include "WindowInfo.h"
  5.  
  6. static struct WindowInfo *LRWI;
  7. static struct Window *LRWnd;
  8. static struct Gadget *LRGList;
  9. static struct Gadget *LRGadgets[4];
  10. static long LRLeft = -1, LRTop = -1, LRWidth = -1, LRHeight = -1;
  11. static struct List *LRList;
  12. static LRCurrent, LREntries;
  13. static void ( * LRFunc )( struct List *, struct Node * );
  14.  
  15. static long MakeLRGadgets( UWORD Breite, UWORD Height )
  16. {
  17.     struct NewGadget ng;
  18.     struct Gadget *g;
  19.  
  20.     if( LRGList )
  21.     {
  22.         RemoveGList( LRWnd, LRGList, -1 );
  23.  
  24.         FreeGadgets( LRGList );
  25.         LRGList = NULL;
  26.     }
  27.  
  28.     if(! (g = CreateContext(&LRGList)))
  29.         return(1L);
  30.  
  31.     ng.ng_VisualInfo = VisualInfo;
  32.     ng.ng_TextAttr = &LRWI->TA;
  33.     ng.ng_GadgetID = 0;
  34.     ng.ng_LeftEdge = Scr->WBorLeft + BORDERX + BEVELX + BUTTONX;
  35.     ng.ng_Width = Breite - 2 * BORDERX - 2 * BEVELX - 2 * INNERX;
  36.     ng.ng_TopEdge = Scr->RastPort.TxHeight + Scr->WBorTop + 1 + BORDERY + BEVELY + BUTTONY;
  37.  
  38.  
  39.     ng.ng_GadgetText = 0;
  40.     ng.ng_Height = Height - LRWI->TF->tf_YSize - 6 - 2 * BORDERY - 2 * BEVELY - 2 * BUTTONY - INNERGADGETY;
  41.  
  42.     LRGadgets[0] = g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, LRList, GTLV_ShowSelected, NULL, GTLV_Selected, LRCurrent, TAG_DONE );
  43.     ng.ng_GadgetID++;
  44.  
  45.  
  46.     ng.ng_LeftEdge = Scr->WBorLeft + BORDERX;
  47.     ng.ng_Width = ( Breite - INNERGADGETX - 2 * BORDERX ) / 2;
  48.     ng.ng_Flags = PLACETEXT_IN;
  49.     ng.ng_GadgetText = GetStr( MSG_GADGET_OK );
  50.     ng.ng_Height = LRWI->TF->tf_YSize + 6;
  51.     ng.ng_TopEdge = Height + LRWnd->BorderTop - ng.ng_Height - BORDERY;
  52.     LRGadgets[1] = g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  53.     ng.ng_GadgetID++;
  54.  
  55.  
  56.     ng.ng_LeftEdge = Breite - ng.ng_Width;
  57.     ng.ng_GadgetText =  GetStr( MSG_GADGET_CANCEL );
  58.     LRGadgets[2] = g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  59.  
  60.     if(!g) return(2L);
  61.  
  62.     if( LRWnd )
  63.     {
  64.         SetzeMuster( LRWnd );
  65.  
  66.         MyFilledDrawBevelBox(LRWnd->RPort,    LRWnd->BorderLeft + BORDERX,
  67.                                                             LRWnd->BorderTop + BORDERY,
  68.                                                             LRWnd->Width - LRWnd->BorderRight - LRWnd->BorderLeft - BORDERX * 2,
  69.                                                             LRWnd->Height - LRWnd->BorderBottom - LRWnd->BorderTop - 2 * BORDERY - LRWI->TF->tf_YSize - 6 - BUTTONY,
  70.                                                             TRUE);
  71.     
  72.         AddGList( LRWnd, LRGList, -1, -1, 0);
  73.  
  74.         RefreshGadgets(LRGList, LRWnd, 0);
  75.         GT_RefreshWindow( LRWnd, NULL );
  76.     }
  77. }
  78.  
  79. void CloseLR( void )
  80. {
  81.     MyRemoveSignal( 1L << LRWnd->UserPort->mp_SigBit );
  82.     ReleaseMainWindow();
  83.  
  84.     mainflags &= ~MF_LISTREQ;
  85.  
  86.     if( LRWnd )
  87.     {
  88.         LRLeft = LRWnd->LeftEdge;
  89.         LRTop = LRWnd->TopEdge;
  90.         LRWidth = LRWnd->Width - LRWnd->BorderLeft - LRWnd->BorderRight;
  91.         LRHeight = LRWnd->Height - LRWnd->BorderTop - LRWnd->BorderBottom;
  92.  
  93.         CloseWindow( LRWnd );
  94.         LRWnd = NULL;
  95.     }
  96.  
  97.     if( LRGList )
  98.     {
  99.         FreeGadgets( LRGList );
  100.         LRGList = NULL;
  101.     }
  102.  
  103.     if( LRWI )
  104.     {
  105.         NewCalcCleanup( LRWI );
  106.         LRWI = NULL;
  107.     }
  108. }
  109.  
  110. static void DoLRWndMsg( void )
  111. {
  112.     BOOL CloseMe = FALSE;
  113.     struct IntuiMessage    *m, Msg;
  114.     struct Gadget *gad;
  115.  
  116.     while( m = GT_GetIMsg( LRWnd->UserPort ))
  117.     {
  118.         CopyMem((char *)m, (char *)&Msg, (long)sizeof(struct IntuiMessage));
  119.  
  120.         GT_ReplyIMsg(m);
  121.  
  122.         gad = (struct Gadget *) Msg.IAddress;
  123.  
  124.         switch( Msg.Class )
  125.         {
  126.             case    IDCMP_NEWSIZE:
  127.                 {
  128.                     MakeLRGadgets( LRWnd->Width - LRWnd->BorderLeft - LRWnd->BorderRight, LRWnd->Height - LRWnd->BorderTop - LRWnd->BorderBottom );
  129.     
  130.                     RefreshWindowFrame( LRWnd );
  131.                 }
  132.                 break;
  133.  
  134.             case    IDCMP_RAWKEY:
  135.                 switch( Msg.Code )
  136.                 {
  137.                     case CURSORUP:
  138.                         if( LRCurrent > 0 )
  139.                         {
  140.                             LRCurrent--;
  141.  
  142.                             GT_SetGadgetAttrs( LRGadgets[ 0 ], LRWnd, NULL,
  143.                                 GTLV_Selected, LRCurrent,
  144.                                 GTLV_Top, LRCurrent,
  145.                                 GTLV_MakeVisible, LRCurrent,
  146.                                 TAG_DONE);
  147.                         }
  148.                         break;
  149.                     case CURSORDOWN:
  150.                         if( LRCurrent < LREntries - 1 )
  151.                         {
  152.                             LRCurrent++;
  153.  
  154.                             GT_SetGadgetAttrs( LRGadgets[ 0 ], LRWnd, NULL,
  155.                                 GTLV_Selected, LRCurrent,
  156.                                 GTLV_Top, LRCurrent,
  157.                                 GTLV_MakeVisible, LRCurrent,
  158.                                 TAG_DONE);
  159.                         }
  160.                         break;
  161.                 }
  162.                 break;
  163.  
  164.             case    IDCMP_VANILLAKEY:
  165.                 switch( Msg.Code )
  166.                 {
  167.                     case 27:
  168.                         CloseMe = TRUE;
  169.                         LRCurrent = -1;
  170.                         break;
  171.                     case 13:
  172.                         CloseMe = TRUE;
  173.                         break;
  174.                     default:
  175.                         if( ToUpper( Msg.Code ) == ToUpper( GetUnderlinedKey( GetStr( MSG_GADGET_OK ))))
  176.                             CloseMe = TRUE;
  177.                         else
  178.                         if( ToUpper( Msg.Code ) == ToUpper( GetUnderlinedKey( GetStr( MSG_GADGET_CANCEL ))))
  179.                         {
  180.                             CloseMe = TRUE;
  181.                             LRCurrent = -1;
  182.                         }
  183.                         break;
  184.                 }
  185.                 break;
  186.  
  187.             case    IDCMP_CLOSEWINDOW:
  188.                 CloseMe = TRUE;
  189.                 break;
  190.  
  191.             case    IDCMP_GADGETUP:
  192.                 switch( gad->GadgetID )
  193.                 {    
  194.                     case 0:
  195.                         if( LRCurrent == Msg.Code )
  196.                         {
  197.                             CloseMe = TRUE;
  198.                         }
  199.                         else
  200.                             LRCurrent = Msg.Code;
  201.                         break;
  202.  
  203.                     case 1:
  204.                         CloseMe = TRUE;
  205.                         break;
  206.  
  207.                     case 2:
  208.                         LRCurrent = -1;
  209.                         CloseMe = TRUE;
  210.                         break;
  211.                 }
  212.         }
  213.     }
  214.  
  215.     if( CloseMe )
  216.     {
  217.         CloseLR();
  218.  
  219.         if( LRCurrent != -1 )
  220.         {
  221.             struct Node *node;
  222.             int k;
  223.  
  224.             node = LRList->lh_Head;
  225.  
  226.             for( k = 0; k < LRCurrent; k++ )
  227.                 node = node->ln_Succ;
  228. #ifdef DEBUG
  229.             Printf("LRCu=%ld %s\n", LRCurrent, node ->ln_Name);
  230. #endif
  231.             LRFunc( LRList, node );
  232.         }
  233.         else
  234.             LRFunc( LRList, 0 );
  235.     }
  236. }
  237.  
  238. BOOL OpenListReq( struct List *List, char *Title, void ( * Func )())
  239. {
  240.     if( LRWnd )
  241.     {
  242.         ActivateWindow( LRWnd );
  243.         return( TRUE );
  244.     }
  245.  
  246.     if(LRLeft == -1) LRLeft = AktuDI->Wnd->LeftEdge + WNDXOPENOFF;
  247.     if(LRTop == -1) LRTop = AktuDI->Wnd->TopEdge + WNDYOPENOFF;
  248.  
  249.     LRCurrent = 0;
  250.  
  251.     LRFunc = Func;
  252.  
  253.     {
  254.         struct Node *n;
  255.  
  256.         LREntries = 0;
  257.  
  258.         n = List->lh_Head;
  259.  
  260.         while( n->ln_Succ != List->lh_Tail )
  261.         {
  262.             n = n->ln_Succ;
  263.             LREntries++;
  264.         }
  265.     }
  266.  
  267.     if( LRWI = NewCalcSetup( Scr ))
  268.     {
  269.         UWORD MinWidth, MinHeight;
  270.  
  271.         MinWidth =    MyTextLength( &LRWI->RP, GetStr( MSG_GADGET_OK )) + 16 +
  272.                         MyTextLength( &LRWI->RP, GetStr( MSG_GADGET_CANCEL )) + 16 +
  273.                         INNERGADGETX;
  274.  
  275.         MinWidth += 2 * BORDERX + 2 * BEVELX + 2 * INNERX;
  276.  
  277.         if( LRWidth == -1 )
  278.             LRWidth = 30 * LRWI->AverageCharWidth;
  279.  
  280.         if( LRWidth < MinWidth )
  281.             LRWidth = MinWidth;
  282.  
  283.         MinHeight = (LRWI->TF->tf_YSize + 6) + 2 * BORDERY + 2 * BEVELY + 2 * INNERY;
  284.  
  285.         MinHeight += LRWI->TF->tf_YSize * 4 + LISTVIEWBORDERY + INNERGADGETY;
  286.         if( !Kick30 ) MinHeight += LISTVIEWBORDERY20;
  287.  
  288.         if(( LRHeight == -1 ) || ( LRHeight < MinHeight ))
  289.             LRHeight = MinHeight;
  290.  
  291. #ifndef WFLG_SIZEBOTTOM
  292. #define WFLG_SIZEBOTTOM WFLG_SIZEBBOTTOM
  293. #endif
  294.  
  295.         if ( ! ( LRWnd = OpenWindowTags( NULL,
  296.             WA_Left,    LRLeft,
  297.             WA_Top,        LRTop,
  298.             WA_InnerWidth,    LRWidth,
  299.             WA_InnerHeight,    LRHeight,
  300.             WA_MinWidth,    MinWidth,
  301.             WA_MinHeight,    MinHeight,
  302.             WA_MaxWidth,    -1,
  303.             WA_MaxHeight,    -1,
  304.             WA_IDCMP,    BUTTONIDCMP | INTEGERIDCMP | TEXTIDCMP | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_REFRESHWINDOW | IDCMP_NEWSIZE,
  305.             WA_Flags,    WFLG_SIZEGADGET | WFLG_SIZEBOTTOM | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  306.             WA_Title,    Title,
  307.             WA_ScreenTitle,    "FileX '94",
  308.             WA_PubScreen,    Scr,
  309.             TAG_DONE )))
  310.             return(3L);
  311.  
  312.         BlockMainWindow();
  313.  
  314.         LRList = List;
  315.  
  316.         MakeLRGadgets( LRWidth, LRHeight );
  317.  
  318.         mainflags |= MF_LISTREQ;
  319.  
  320.         MyAddSignal( 1L << LRWnd->UserPort->mp_SigBit, &DoLRWndMsg );
  321.     }
  322. }
  323.  
  324.